using System;
using EYDIngenieria.ERP.Aplicacion.Mantenedores;
using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;
using EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio;

namespace EYDIngenieria.ERP.Aplicacion.Gestion
{
    public class GestionOrdenDeCompra
    {
        private RepositorioOrdenDeCompra repositorioOrdenDeCompra = new RepositorioOrdenDeCompra();
        private RepositorioDetalleOrdenDeCompra repositorioDetalleOrdeDeCompra = new RepositorioDetalleOrdenDeCompra();
        private MantenedorEstadoOrdenDeCompra mantenedorEstadoOrdenDeCompra = new MantenedorEstadoOrdenDeCompra();
        private GestionFactura gestionFactura = new GestionFactura();

        public void GuardarOrdenDeCompra(OrdenDeCompra f)
        {
            OrdenDeCompra ordenDeCompra = new OrdenDeCompra();
            ordenDeCompra.Fecha = f.Fecha;
            ordenDeCompra.MontoTotal = f.MontoTotal;
            //ordenDeCompra.NumeroOrdenDeCompra = f.NumeroOrdenDeCompra;
            ordenDeCompra.NumeroOrdenDeCompra = f.Id;
            ordenDeCompra.Proveedor = f.Proveedor;
            ordenDeCompra.EstadoOrdenDeCompra = mantenedorEstadoOrdenDeCompra.Buscar("I")[0];
            repositorioOrdenDeCompra.Agregar(ordenDeCompra);
            foreach (DetalleOrdenDeCompra d in f.Detalle)
            {
                d.OrdenDeCompra = ordenDeCompra;
                d.Fecha = ordenDeCompra.Fecha;
                repositorioDetalleOrdeDeCompra.Agregar(d);
                ordenDeCompra.MontoTotal = ordenDeCompra.MontoTotal + (d.ValorTotal);
            }
            repositorioOrdenDeCompra.Modificar(ordenDeCompra);
       }
        public void ActualizaMontoTotal(OrdenDeCompra o)
        {
            foreach (DetalleOrdenDeCompra d in o.Detalle)
            {
                o.MontoTotal = o.MontoTotal + (d.ValorTotal);
            }
            repositorioOrdenDeCompra.Modificar(o);
        }

        public OrdenDeCompra[] Listar()
        {
            return repositorioOrdenDeCompra.Listar();
        }

        public OrdenDeCompra[] Listar(EstadoOrdenDeCompra eoc)
        {
            return repositorioOrdenDeCompra.Listar(eoc);
        }

        public void Modificar(OrdenDeCompra oc)
        {

            foreach (DetalleOrdenDeCompra doc in oc.Detalle)
            {
                if (doc.Id ==0)
                {
                    doc.Fecha = DateTime.Now;
                    repositorioDetalleOrdeDeCompra.Agregar(doc);
                }
                    
               
            }
            repositorioOrdenDeCompra.Modificar(oc);
        }

        public OrdenDeCompra Obtener(int id)
        {
            return repositorioOrdenDeCompra.Obtener(id);
        }

        public void Facturar(OrdenDeCompra oc,int numeroFactura)
        {
            Factura f = new Factura();
            f.Fecha = DateTime.Now;
            f.NumeroFactura = numeroFactura;
            f.Proveedor = oc.Proveedor;
            DetalleFactura df;
            foreach (DetalleOrdenDeCompra doc in oc.Detalle)
            {

                df = new DetalleFactura();
                df.Cantidad = doc.Cantidad;
                df.Producto = doc.Producto;
                df.ValorUnitario = doc.ValorUnitario;
                df.ValorTotal = doc.ValorTotal;
                f.Detalle.Add(df);
            }
            oc.Factura = gestionFactura.GuardarFactura(f);
            Modificar(oc);
        }

        public void Eliminar(OrdenDeCompra oc)
        {
            repositorioOrdenDeCompra.Eliminar(oc);
        }
    }
}
